﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using System.Globalization;

namespace OffInvoiceExcelAddIn
{
    /// <summary>
    /// Clase Singleton, la cual solo tendra una instancia durante la ejecución, en la que se cargan
    /// todos los mensajes utilizados en el programa, en el idioma en el que esté Office, desde un
    /// archivo xml, siempre que exista el xml del idioma.
    /// </summary>
    class ControlMessages
    {

        #region "Fields"

        /// <summary>
        /// Única instancia de clase
        /// </summary>
        private static ControlMessages messages = null;

        /// <summary>
        /// Documento que contendrá todos los mensajes.
        /// </summary>
        private static XmlDocument docMessages = null;

        #endregion

        #region "Enum"

        /// <summary>
        /// Enumeracón que contiene los nombre de la etiquetas que identifican a cada mensaje dentro
        /// del archivo xml
        /// </summary>
        public enum Msg
        {
            ErrorLoadCertificates,
            ErrorLoadLanguage,
            ErrorLoadFacturaeXml,
            ErrorLoadConfig,
            ErrorSaveConfig,
            ErrorLoadTemplate,
            ErrorDeserealizarMngFile,
            ErrorDeserealizarMngFileReg,
            ErrorCreatingMngFile,
            ErrorCreatingMngFileReg,
            ErrorMngFileNotFound,
            ErrorNoCustomPartFound,
            ErrorSchema,
            ErrorModalityI,
            ErrorModalityL,
            ErrorInvoiceIssuerTypeTE,
            ErrorPersonTypeCodeF,
            ErrorPersonTypeCodeJ,
            ErrorCountryCodeESP,
            ErrorTotalInvoicesAmountEquivalentInEuros,
            ErrorTotalOutstandingAmountEquivalentInEuros,
            ErrorTotalExecutableAmountEquivalentInEuros,
            ErrorTotalAmountInvoiceTotal,
            ErrorTotalAmountTotalOutstandingAmount,
            ErrorTotalAmountTotalExecutableAmount,
            ErrorFactoringAssignmentDataPersonTypeCodeF,
            ErrorFactoringAssignmentDataPersonTypeCodeJ,
            ErrorIssuerTypeCodeF,
            ErrorIssuerTypeCodeJ,
            ErrorReciverTypeCodeF,
            ErrorReciverTypeCodeJ,
            ErrorInvoiceClassCorrective,
            ErrorInvoiceClassInvoicingPeriod,
            ErrorInvoiceClassCorrectionMethodDescription,
            ErrorTaxCurrencyCode,
            ErrorTaxRate,
            ErrorTaxableBase,
            ErrorTaxableBaseEquivalentInEuros,
            ErrorTaxesOutputsTaxAmountEquivalentInEuros,
            ErrorTaxesOutputsPercent,
            ErrorTaxesWithheldTaxRate,
            ErrorTaxableBaseTotalAmount,
            ErrorTaxesEquivalentInEuros,
            ErrorTaxAmountEquivalentInEuros,
            ErrorTaxAmountPercentTaxableBase,
            ErrorGeneralDiscounts,
            ErrorGeneralSurcharges,
            ErrorTotalGeneralDiscounts,
            ErrorTotalGeneralSurcharges,
            ErrorTotalGrossAmountBeforeTaxes,
            ErrorTotalTaxOutputs,
            ErrorTotalTaxesWithheld,
            ErrorInvoiceTotal,
            ErrorSubsidyRate,
            ErrorTotalPaymentsOnAccount,
            ErrorTotalOutstandingAmount,
            ErrorWithholdingRate,
            ErrorTotalExecutableAmount,
            ErrorTotalCost,
            ErrorDiscountRate,
            ErrorChargeRate,
            ErrorGrossAmount,
            ErrorSumGrossAmount,
            ErrorAccountToBeCredited,
            ErrorAccountToBeDebited,
            ErrorOutlook,
            ErrorLoadUrlTimeStamp,
            ErrorMandatoryField,
            ErrorSignNotExist,
            ErrorCheckSignature,
            ErrorCertificateNotExist,
            ErrorCertificateVerify,
            ErrorCertificateExpired,
            ErrorOIDCRL,
            ErrorCheckOnLineCRL,
            ErrorOIDOCSP,
            ErrorCheckOnLineOCSP,
            ErrorCheckCertificate,
            ErrorCertificateId,
            ErrorCertificateRevoked,
            ErrorUnknownCertificate,
            ErrorUpdateCRLDate,
            ErrorRevokedCertificateConflictDate,
            ErrorSigningInvoice,
            ErrorOnAccountingValidation,
            ErrorUrlTimeStamp,
            ErrorInvoiceNotGenerated,
            ErrorNotValidTemplate,
            ErrorAddRecived,
            ErrorIssuedDate,
            ErrorPostCode,
            ErrorInvoicingPeriod,
            ErrorFileNotFound,
            ErrorInvoiceValidation,
            ErrorLoadInvoiceXML,
            ErrorCorrectiveReason,
            ErrorCorrectiveMethod,
            ErrorCauses,
            ErrorWhiteDocument,
            ErrorAddToReceived,
            ErrorFails,
            ErrorCertificateNotStored,
            ErrorFileOpenNoDelete,
            ErroCRLOCSPNotFound,
            ErrorInvoiceHaveNotDetails,
            ErrorInvoiceNotSignated,
            ErrorLoadFile,
            WarningThirdPartyControlsNotFound,
            WarningRevokedCertificate,
            WarningCertificateConfidence,
            CaptionCompanyInformation,
            CaptionCertificates,
            CaptionFacturae,
            CaptionCustomize,
            CaptionInvoiceType,
            CaptionConfig,
            CaptionTemplateChooser,
            CaptionActionPane,
            CaptionRibbon,
            CaptionSavedInfo,
            CaptionLoadTemplate,
            CaptionCreatingMngFile,
            CaptionMngFile,
            CaptionMngFileReg,
            CaptionInvoiceSearch,
            CaptionOutlook,
            CaptionCorrectiveInvoice,
            CaptionValidation,
            InfoCorrectFields,
            InfoCIF,
            InfoTypePerson,
            InfoTypeResidence,
            InfoCompanyName,
            InfoName,
            InfoFirstName,
            InfoTelephone,
            InfoFax,
            InfoRoadType,
            InfoAddress,
            InfoRoadNumber,
            InfoCP,
            InfoCounty,
            InfoState,
            InfoCountry,
            InfoUrlLog,
            InfoUrlTemplate,
            InfoRestart,
            InfoSaveConfigOk,
            InfoUrlSTM,
            InfoUrlIssuedDirectory,
            InfoUrlRecivedDirectory,
            InfoUrlDraftsDirectory,
            InfoConfigModifyOrEmpty,
            InfoConfigQuestion,
            InfoSavedRegistry,
            InfoRegistryFileCreated,
            InfoNoneInvoiceFound,
            InfoNotExistDefaultTemplate,
            InfoSaveWhiteDoc,
            InfoNumberValue,
            InfoSignedInvoice,
            InfoGeneratedInvoice,
            InfoExportedInvoice,
            InfoIRPFPercent,
            InfoValidateReceivedInvoiceSchema,
            InfoValidateReceivedInvoiceAccount,
            InfoValidateReceivedInvoiceOK,
            InfoAddRecived,
            InfoMail,
            InfoSignedDraft,
            InfoInvoiceValidation,
            InfoValidationOK,
            InfoCheckDraft,
            InfoImportOK,
            InfoImposibleValidate,
            InfoThirdParty,
            InvoiceAlReadySignated,
            InfoImportDataOK,
            MsgInfoSchema,
            MsgAccountOK,
            MsgSignedOK,
            MsgInfoSignedType,
            MsgInfoIssued,
            MsgInfoSubject,
            MsgInfoCertificateStatus,
            MsgSchemaV31MalFormat,
            MsgUnknown, MsgNoAccountValidation,
            MsfNoSignedValidation,
            MsgErrorAccountValidation,
            MsgErrorSignedValidation,
            MsgSing,
            MsgAccounValidation,
            MsgInfoViewDetails,
            MsgAmountNotValid,
            InfoSaveDialog,
            MsgElectronic,
            MsgPaper,
            ErrorInvalidCIFTH,
            ErrorInvalidCIFBP,
            ErrorInvalidCIFSP,
            MsgInfoSchemaFacturae31,
            MsgInfoSchemaFacturae32,
            MsgInfoSchemaUBL,
            MsgInfoSchemaCII,
            MsgInfoSchemaPaper,
            XmlMalformed,
            CaptionSTS,
            ErrorNameTimeStamp,
            ErrorURLTimeStamp,
            ErrorUserTimeStamp,
            ErrorPasswordTimeStamp,
            MsgRemoveTimeStamp

        }

        #endregion

        #region "Constructors"

        /// <summary>
        /// Único constructor de la clase.
        /// Privado, para que solo pueda ser accesible dentro de la clase.
        /// De esta manera nos aseguramos una única instancia
        /// </summary>
        private ControlMessages()
        {
        }

        #endregion

        #region "Public Methods"

        /// <summary>
        /// Método estático que obtiene la única instancia de la clase si existe y sino se la crea
        /// por primera vez.
        /// </summary>
        /// <returns>La instacia de la clase</returns>
        public static ControlMessages getInstance()
        {
            if (messages == null) //Verificamos si no ha sido creado
            {
                messages = new ControlMessages();
                LoadMessagesFile();
            }
            return messages; //Regresamos la instancia unica del objeto
        }


        /// <summary>
        /// Método que recibe por parámetor el nombre de la etiqueta del mensaje que quiere, busca esa etiqueta
        /// en el xml y devuelve un string con el mensaje asociado a esa etiqueta.
        /// </summary>
        /// <param name="msg">Nombre de la etiqueta</param>
        /// <returns>Mensaje asociado a la etiqueta</returns>
        public string getMessage(Msg msg)
        {
            XPathNavigator navigator = docMessages.CreateNavigator();
            XPathNavigator node;
            node = navigator.SelectSingleNode(String.Concat("//", msg.ToString("g")));
            if (node == null)
            {
                return msg.ToString("g");
            }
            string[] data = node.Value.Split('\\');
            if (data.Length > 1)
            {
                string value = string.Empty;
                for (int i = 0; i < data.Length; i++)
                {
                    value = string.Concat(value, data[i], " \n");
                }
                return value;
            }
            return node.Value;
        }

        /// <summary>
        /// Método que recibe por parámetor el nombre de la etiqueta del mensaje que quiere, busca esa etiqueta
        /// en el xml y devuelve un string con el mensaje asociado a esa etiqueta.
        /// </summary>
        /// <param name="msg">Nombre de la etiqueta</param>
        /// <returns>Mensaje asociado a la etiqueta</returns>
        public string getMessage(string msg)
        {
            XPathNavigator navigator = docMessages.CreateNavigator();
            XPathNavigator node;
            try
            {
                node = navigator.SelectSingleNode(String.Concat("//", msg));
            }
            catch (Exception)
            {
                return msg;
            }
            if (node == null)
            {
                return msg;
            }
            string[] data = node.Value.Split('\\');
            if (data.Length > 1)
            {
                string value = string.Empty;
                for (int i = 0; i < data.Length; i++)
                {
                    value = string.Concat(value, data[i], " \n");
                }
                return value;
            }
            return node.Value;
        }

        #endregion

        #region "Private Methods"

        /// <summary>
        /// Método que comprueba el idioma de Office y carga el archivo de menasajes en el
        /// idioma correspondiente.
        /// </summary>
        private static void LoadMessagesFile()
        {
            try
            {
                docMessages = new XmlDocument();
                CultureInfo cInfo = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
                String language = cInfo.Name;
                docMessages.Load(string.Concat(Globals.ThisAddIn.EnvironmentVariable + Paths.MessagesPath, language, ".xml"));

            }
            catch (Exception)
            {
                //throw e;
            }
        }

        #endregion

    }
}
